package com.binhthuan.catechist.server.domain;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import com.google.gson.annotations.Expose;

/**
 * @author Giang Đinh - Khối lớp, tương ứng với bảng <b>ec_grade</b> trong cơ sở
 *         dữ liệu.
 */
@Entity
@Table(name = "ec_grade")
public class Grade extends AbstractObject {

    /**
     * Mã khối lớp.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Expose
    private Integer id;
    
    /**
     * Tên khối lớp.
     */
    @Column(name = "name")
    @Expose
    private String name;
    
    /**
     * Trưởng khối lớp.
     */
    @ManyToOne
    @JoinColumn(name = "leader_id", referencedColumnName = "person_id")
    @Expose
    private Trainer leader;
    
    /**
     * Các lớp trong khối.
     */
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    @JoinColumn(name = "grade_id")
    private Set<Course> courses;

    public Grade() {
        courses = new HashSet<Course>(0);
    }
    
    /**
     * Lấy mã khối lớp.
     * @return Mã khối lớp.
     */
    public Integer getId() {
        return id;
    }

    /**
     * Gán mã khối lớp.
     * @param id
     *            Mã khối lớp.
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Lấy tên khối lớp.
     * @return Tên khối lớp.
     */
    public String getName() {
        return name;
    }

    /**
     * Gán tên khối lớp.
     * @param name
     *            Tên khối lớp.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Lấy trưởng khối lớp.
     * @return Trưởng khối lớp.
     */
    public Trainer getLeader() {
        return leader;
    }

    /**
     * Gán trưởng khối lớp.
     * @param leader
     *            Trưởng khối lớp.
     */
    public void setLeader(Trainer leader) {
        this.leader = leader;
    }

    /**
     * Lấy các lớp trong khối.
     * @return Các lớp trong khối.
     */
    public Set<Course> getCourse() {
        return courses;
    }

    /**
     * Gán lớp trong khối.
     * @param courses 
     *            Các lớp trong khối.
     */
    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }
}
